基本类型与对象间的转换
类似与 Java 中基本数据类型的自动装箱拆箱,JavaScript 也有类似的动作,基本数据类型在做一些运算时,会临时包装一个对象,做完运算后,又自动释放该对象。我们可以通过几个例子来说明:
var str = "JavaScript Kernal";
alert(str.length);//打印 17
str 为一个字符串,通过 typeof 可知其 type 为”string”,而:
var str2 = new String("JavaScript Kernal");
alert(typeof str2);
可知,str2 的 type 为”object”,即这两者并不相同,那么为什么可以使用 str.length 来的到 str 的长度呢?事实上,当使用 str.length 时,JavaScript 会自动包装一个临时的 String 对象,内容为 str 的内容,然后获取该对象的 length 属性,最后,这个临时的对象将被释放。
而将对象转换为基本类型则是通过这样的方式:通过调用对象的 valueOf()方法来取得 对象的值,如果和上下文的类型匹配,则使用该值。如果 valueOf 取不到值的话,则需要 调用对象的 toString()方法,而如果上下文为数值型,则又需要将此字符串转换为数值。 由于 JavaScript 是弱类型的,所以 JavaScript 引擎需要根据上下文来“猜测”对象的类 型,这就使得 JavaScript 的效率比编译型的语言要差一些。valueOf()的优先级要高于 toString()。
valueOf()的作用是,将一个对象的值转换成一种合乎上下文需求的基本类型,toString()则名副其实,可以打印出对象对应的字符串,当然前提是你已经“重载”了 Object的 toString()方法。
事实上,这种转换规则会导致很多的问题,比如,所有的非空对象,在布尔值环境下, 都会被转成 true,比如:
function convertTest(){
if(new Boolean(false) && new Object() &&
new String("") && new Array()){
alert("convert to boolean")
}
}
convertTest();//convert to Boolean
初学者容易被 JavaScript 中的类型转换规则搞晕掉,很多情况下会觉得那种写法看着 非常别扭,其实只需要掌握了规则,这些古怪的写法会大大的提高代码的性能,我们通过例子来学习这些规则:
var x = 3;
var y = x + "2";// => 32
var z = x + 2;// => 5
alert(y);
alert(z);
通常可以在 JS 代码中发现这样的代码:
if(datamodel.item){
//do something...
}else{
datamodel.item = new Item();
}
这种写法事实上具有更深层次的含义: 应该注意到,datamodel.item 是一个对象(字符串,数字等),而 if 需要一个 boolean 型的表达式,所以这里进行了类型转换。在 JavaScript 中,如果上下文需要 boolean 型 的值,则引擎会自动将对象转换为 boolean 类型。转换规则为,如果该对象非空,则转换为 true,否则为 false.因此我们可以采取这种简写的形式。
而在传统的编程语言(强类型)中,我们则需要:
if(datamodel.item != null){
//do something...
}else{
datamodel.item = new Item();
}
{$ activeFileHint $}